package com.example.chamberlainserver.mapper;

import com.example.chamberlainserver.Entry.Material;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 物资数据访问接口
 */
@Mapper
public interface MaterialMapper {
    
    /**
     * 添加物资
     * @param material 物资信息
     * @return 影响行数
     */
    int insertMaterial(Material material);
    
    /**
     * 根据ID更新物资
     * @param material 物资信息
     * @return 影响行数
     */
    int updateMaterial(Material material);
    
    /**
     * 根据ID删除物资
     * @param id 物资ID
     * @return 影响行数
     */
    int deleteMaterial(@Param("id") Long id);
    
    /**
     * 根据ID查询物资
     * @param id 物资ID
     * @return 物资信息
     */
    Material getMaterialById(@Param("id") Long id);
    
    /**
     * 获取所有物资
     * @return 物资列表
     */
    List<Material> getAllMaterials();
    
    /**
     * 根据分类ID获取物资
     * @param categoryId 分类ID
     * @return 物资列表
     */
    List<Material> getMaterialsByCategory(@Param("categoryId") Integer categoryId);
    
    /**
     * 根据存放位置ID获取物资
     * @param locationId 存放位置ID
     * @return 物资列表
     */
    List<Material> getMaterialsByLocation(@Param("locationId") Integer locationId);
    
    /**
     * 根据物资名称搜索物资
     * @param name 物资名称关键字
     * @return 物资列表
     */
    List<Material> searchMaterialsByName(@Param("name") String name);
    
    /**
     * 获取库存不足的物资（库存数量小于最低库存预警值）
     * @return 物资列表
     */
    List<Material> getLowStockMaterials();
    
    /**
     * 更新物资库存
     * @param id 物资ID
     * @param quantity 新的库存数量
     * @param updateTime 更新时间
     * @return 影响行数
     */
    int updateMaterialStock(
            @Param("id") Long id, 
            @Param("quantity") Integer quantity, 
            @Param("updateTime") LocalDateTime updateTime);
    
    /**
     * 更新物资盘点时间
     * @param id 物资ID
     * @param inventoryTime 盘点时间
     * @param updateTime 更新时间
     * @return 影响行数
     */
    int updateInventoryTime(
            @Param("id") Long id, 
            @Param("inventoryTime") LocalDateTime inventoryTime, 
            @Param("updateTime") LocalDateTime updateTime);
    
    /**
     * 根据分类ID统计物资数量
     * @param categoryId 分类ID
     * @return 物资数量
     */
    int countMaterialsByCategory(@Param("categoryId") Integer categoryId);
    
    /**
     * 根据存放位置ID统计物资数量
     * @param locationId 存放位置ID
     * @return 物资数量
     */
    int countMaterialsByLocation(@Param("locationId") Integer locationId);
    
    /**
     * 分页查询物资列表
     * @param params 查询参数
     * @return 物资列表
     */
    List<Material> getPagedMaterialList(Map<String, Object> params);
    
    /**
     * 获取分页查询的总记录数
     * @param params 查询参数
     * @return 总记录数
     */
    Long getPagedMaterialCount(Map<String, Object> params);
}